﻿'-----------------------------------------------------------
'
'              Kniffel 2008 Interpreter Klasse
'
'             Code: Frederik Born, Eike Kutscher
'
'      Please remind that this project is open-source!
'
'------------------------------------------------------------

''' <summary>
''' Klasse zum interpretieren der Eingabe
''' </summary>
Public Class kInterpreter

#Region "Properties"

    Dim tempint() As Integer
    ''' <summary>
    ''' Gibt das Ergebnis als Ganzzahl zurück
    ''' </summary>
    ReadOnly Property GetResult(ByVal input As Integer())
        Get
            tempint = input
            If tempint.Length < 5 Then
                Return -1
            End If
            If chkniffel(tempint) = True Then Return 1
            If chgstreet(tempint) = True Then Return 2
            If chsstreet(tempint) = True Then Return 3
            If chfullhouse(tempint) = True Then Return 4
            If chfour(tempint) = True Then Return 5
            If chthree(tempint) = True Then Return 6
            Return 0
        End Get
    End Property

    ''' <summary>
    ''' Gibt die Anzahl des Elementes 1 in dem angegebenen Array zurück. 
    ''' Bei einem kritischem Fehler ist der Rückgabewert -1
    ''' </summary>
    ReadOnly Property One(ByVal input As Integer())
        Get
            tempint = input
            If tempint.Length < 5 Then
                Return -1
            End If
            Return countint(tempint, 1)
        End Get
    End Property

    ''' <summary>
    ''' Gibt die Anzahl des Elementes 2 in dem angegebenen Array zurück. 
    ''' Bei einem kritischem Fehler ist der Rückgabewert -1
    ''' </summary>
    ReadOnly Property Two(ByVal input As Integer())
        Get
            tempint = input
            If tempint.Length < 5 Then
                Return -1
            End If
            Return countint(tempint, 2)
        End Get
    End Property

    ''' <summary>
    ''' Gibt die Anzahl des Elementes 3 in dem angegebenen Array zurück. 
    ''' Bei einem kritischem Fehler ist der Rückgabewert -1
    ''' </summary>
    ReadOnly Property Three(ByVal input As Integer())
        Get
            tempint = input
            If tempint.Length < 5 Then
                Return -1
            End If
            Return countint(tempint, 3)
        End Get
    End Property

    ''' <summary>
    ''' Gibt die Anzahl des Elementes 4 in dem angegebenen Array zurück. 
    ''' Bei einem kritischem Fehler ist der Rückgabewert -1
    ''' </summary>
    ReadOnly Property Four(ByVal input As Integer())
        Get
            tempint = input
            If tempint.Length < 5 Then
                Return -1
            End If
            Return countint(tempint, 4)
        End Get
    End Property

    ''' <summary>
    ''' Gibt die Anzahl des Elementes 5 in dem angegebenen Array zurück. 
    ''' Bei einem kritischem Fehler ist der Rückgabewert -1
    ''' </summary>
    ReadOnly Property Five(ByVal input As Integer())
        Get
            tempint = input
            If tempint.Length < 5 Then
                Return -1
            End If
            Return countint(tempint, 5)
        End Get
    End Property
    ''' <summary>
    ''' Gibt die Anzahl des Elementes 6 in dem angegebenen Array zurück. 
    ''' Bei einem kritischem Fehler ist der Rückgabewert -1
    ''' </summary>
    ReadOnly Property Six(ByVal input As Integer())
        Get
            tempint = input
            If tempint.Length < 5 Then
                Return -1
            End If
            Return countint(tempint, 6)
        End Get
    End Property
#End Region

#Region "Funktionen"


    ''' <summary>
    ''' Funktion zum überprüfen ob ein Kniffel geworfen wurde.
    ''' </summary>
    Protected Function chkniffel(ByVal inp() As Integer) As Boolean
        Dim numbers(6) As List(Of Integer)
        For m As Integer = 1 To 6
            numbers(m) = New List(Of Integer)
        Next
        For i As Integer = 0 To inp.Length - 1
            numbers(inp(i)).Add(0)
        Next
        For c As Integer = 1 To 6
            If numbers(c).Count = 5 Then Return True
        Next
        Return False
    End Function

    ''' <summary>
    ''' Funktion zum überprüfen ob eine große Straße geworfen wurde.
    ''' </summary>
    Protected Function chgstreet(ByVal inp() As Integer) As Boolean
        Array.Sort(inp)
        Dim strb As New System.Text.StringBuilder
        For i As Integer = 0 To inp.Length - 1
            strb.Append(inp(i))
        Next
        If strb.ToString.Contains("12345") Or strb.ToString.Contains("23456") Then Return True Else Return False
    End Function

    ''' <summary>
    ''' Funktion zum überprüfen ob eine kleine Straße geworfen wurde.
    ''' </summary>
    Protected Function chsstreet(ByVal inp() As Integer) As Boolean
        Array.Sort(inp)
        Dim strb As New System.Text.StringBuilder
        For i As Integer = 0 To inp.Length - 1
            strb.Append(inp(i))
        Next
        If strb.ToString.Contains("1234") Or strb.ToString.Contains("2345") Or strb.ToString.Contains("3456") Then Return True Else Return False
    End Function

    ''' <summary>
    ''' Funktion zum überprüfen ob ein Full House geworfen wurde.
    ''' </summary>
    Protected Function chfullhouse(ByVal inp() As Integer) As Boolean
        Dim numbers(6) As List(Of Integer)
        Dim two, three As Boolean
        For m As Integer = 1 To 6
            numbers(m) = New List(Of Integer)
        Next
        For i As Integer = 0 To inp.Length - 1
            numbers(inp(i)).Add(0)
        Next
        For c As Integer = 1 To 6
            If numbers(c).Count = 3 Then
                three = True
            ElseIf numbers(c).Count = 2 Then
                two = True
            End If
        Next
        If three = True AndAlso two = True Then Return True Else Return False
    End Function

    ''' <summary>
    ''' Funktion zum überprüfen ob ein Viererpasch geworfen wurde.
    ''' </summary>
    Protected Function chfour(ByVal inp() As Integer) As Boolean
        Dim numbers(6) As List(Of Integer)
        For m As Integer = 1 To 6
            numbers(m) = New List(Of Integer)
        Next
        For i As Integer = 0 To inp.Length - 1
            numbers(inp(i)).Add(0)
        Next
        For c As Integer = 1 To 6
            If numbers(c).Count = 4 Then Return True
        Next
        Return False
    End Function

    ''' <summary>
    '''Funktion zum überprüfen ob ein Dreierpasch geworfen wurde.
    ''' </summary>
    Protected Function chthree(ByVal inp() As Integer) As Boolean
        Dim numbers(6) As List(Of Integer)
        For m As Integer = 1 To 6
            numbers(m) = New List(Of Integer)
        Next
        For i As Integer = 0 To inp.Length - 1
            numbers(inp(i)).Add(0)
        Next
        For c As Integer = 1 To 6
            If numbers(c).Count = 3 Then Return True
        Next
        Return False
    End Function



    Protected Function countint(ByVal inp() As Integer, ByVal number As Integer) As String
        Dim numbers(6) As ArrayList
        Dim strb As New System.Text.StringBuilder
        For m As Integer = 1 To 6
            numbers(m) = New ArrayList
        Next
        Debug.Print(inp.Length)
        For i As Integer = 0 To inp.Length - 1
            numbers(inp(i)).Add(0)
        Next
        For w As Integer = 1 To 6
            strb.Append(numbers(w).Count)
        Next
        Dim temparr() As Char = strb.ToString.ToCharArray
        Return temparr(number - 1)
    End Function
#End Region

End Class

